package code.whmmm.util.http.factory;

import code.whmmm.util.http.ResponseHandler;
import code.whmmm.util.http.entity.HttpReq;
import code.whmmm.util.http.entity.HttpValue;
import code.whmmm.util.http.entity.tyep.KvMap;
import code.whmmm.util.http.entity.tyep.ListKv;
import code.whmmm.util.http.impl.DefaultHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;

/**
 * <p><b>
 * HTTP request 创建类
 * </b></p>
 * <br/>
 *
 * @author Zero
 * @date 8/6/2019 10:41 AM
 */
public class HttpReqFactory {

    private static final Logger LOGGER = LoggerFactory.getLogger(HttpReqFactory.class);

    /**
     * 创建 默认的 请求实体,执行响应时，返回 string
     *
     * @return {@code HttpReq<String> }
     */
    public static HttpReq<String> createDefault() {
        HttpReq<String> req = new HttpReq<String>();
        req.setRespHandler(DefaultHandler.DEFAULT_RESP_HANDLER);

        req.addHeader("User-Agent", HttpValue.USER_AGENT);

        return req;
    }

    /**
     * <b>默认header 只有 user-agent ，请自行添加!</b>
     *
     * @param t           返回值类型 class
     * @param method      请求方法
     * @param url         url 地址
     * @param param       请求参数
     * @param respHandler 响应信息
     * @param <T>         响应类型泛型
     * @return 请求信息
     */
    @SuppressWarnings("unchecked")
    public static <T> HttpReq<T> create(Class<T> t,
                                        String method,
                                        String url,
                                        Map<String, Object> param,
                                        ResponseHandler<T> respHandler) {
        String name = t.getSimpleName();
        HttpReq req = new HttpReq();
        try {
            if (respHandler == null) {
                if (HttpValue.STRING.equals(name)) {
                    req.setRespHandler(DefaultHandler.DEFAULT_RESP_HANDLER);
                } else if (HttpValue.MAP.equals(name)) {
                    req.setRespHandler(DefaultHandler.DEFAULT_JSON_MAP);
                } else if (HttpValue.LIST.equals(name)) {
                    req.setRespHandler(DefaultHandler.DEFAULT_JSON_LIST);
                } else {
                    throw new RuntimeException("未找到 responseHandler 对象!");
                }
            } else {
                req.setRespHandler(respHandler);
            }
        } catch (Exception e) {
            LOGGER.error(e.getMessage(), e);
            throw new RuntimeException(e);
        }
        req.setParam(param);
        req.setHttpMethod(method);
        req.setUrl(url);

        req.addHeader("User-Agent", HttpValue.USER_AGENT);
        return req;
    }

    /**
     * 创建 请求 实体, 使用 默认 定义好的 响应处理器
     * <ul>
     *     <li>KvMap.class</li>
     *     <li>ListKv.class</li>
     *     <li>String.class</li>
     * </ul>
     *
     * @param t      KvMap.class 或 ListKv.class, 或 String .class
     * @param method 请求方式
     * @param params 请求信息
     * @param <T>    返回值类型
     * @return 返回值类型
     */
    private static <T> HttpReq<T> createFromTemplate(Class<T> t,
                                                     String url,
                                                     Map<String, Object> params,
                                                     String method) {

        return create(t, method, url, params, null);
    }

    /**
     * <b>创建返回值 为 {@code Map<String,Object>} 的请求。</b><br/>
     * <b>如需修改 请求头，请自行修改！</b>
     * <b>默认header 只有 user-agent ，请自行添加!</b>
     *
     * @param url    请求地址
     * @param params 参数
     * @param method get | post
     * @return HttpReq
     */
    public static HttpReq<KvMap> createMapReq(
            String url,
            Map<String, Object> params,
            String method) {

        return createFromTemplate(KvMap.class, url, params, method);
    }

    /**
     * <b>创建返回值 为 {@code List<Map<String,Object>>} 的请求。</b><br/>
     * <b>如需修改 请求头，请自行修改！</b>
     * <b>默认header 只有 user-agent ，请自行添加!</b>
     *
     * @param url    请求地址
     * @param params 参数
     * @param method get | post
     * @return HttpReq
     */
    public static HttpReq<ListKv> createListReq(
            String url,
            Map<String, Object> params,
            String method) {
        return createFromTemplate(ListKv.class, url, params, method);

    }
}
